package org.madmac.maquina;

import org.madmac.exception.GenerateScriptErrorException;
import java.sql.SQLException;

import org.madmac.exception.CampoNaoInformadoException;
import org.wakeful.conn.Connection;

public class MaquinaBo {

   private static MaquinaBo instance;

   private MaquinaBo() {
   }

   public static MaquinaBo getInstance() {
      if (instance == null) {
         instance = new MaquinaBo();
      }
      return instance;
   }

   public boolean validateAndCreate(Maquina maquina, String path) throws Exception {

      /**
       * Modificado por: Átila Camurça em 20 Jun 2010.
       * Retorna os erros referentes a inserção de uma nova máquina.
       */
      if (maquina.getTombamento() == 0) {
         throw new CampoNaoInformadoException("O campo Tombamento está vazio.");
      } else if (maquina.getSistemaOp() == null || maquina.getSistemaOp().isEmpty()) {
         throw new CampoNaoInformadoException("Selecione o Sistema Operacional.");
      } else if (maquina.getModelo() == null || maquina.getModelo().isEmpty()) {
         throw new CampoNaoInformadoException("O campo Modelo está vazio.");
      } else if (maquina.getModelo().length() < 30) {
         throw new CampoNaoInformadoException("O campo Modelo deve ser mais específico. Digite pelo menos 30 caracteres.");
      }

      // FIXME: mudar essa transação para um DAO!
      boolean works = false;
      try {
         Connection.getInstance().setAutoCommit(false);

         if (MaquinaDao.getInstance().create(maquina) instanceof Integer) {

            if (MaquinaDao.getInstance().insertHostDetails(maquina, path)) {
               works = true;
            } else {
               Connection.getInstance().rollback();
               Connection.getInstance().setAutoCommit(true);
            }
         } else {
            Connection.getInstance().rollback();
            Connection.getInstance().setAutoCommit(true);
         }
         Connection.getInstance().commit();         
         return works;
      } catch (Exception e) {
         Connection.getInstance().rollback();
         throw new Exception(e);
      } finally {
         Connection.getInstance().setAutoCommit(true);
      }
   }

   public boolean updateMaquinaBO(Maquina maquina, boolean alt_modelo, String path)
           throws CampoNaoInformadoException, SQLException, ClassNotFoundException, GenerateScriptErrorException, Exception {

      /**
       * Modificado por: Átila Camurça Alves em 07 Aug 2009.
       * Retorna os erros referentes a atualização de uma máquina.
       */
      if (maquina.getSistemaOp() == null || maquina.getSistemaOp().isEmpty()) {
         throw new CampoNaoInformadoException("Selecione o Sistema Operacional.");
      } else if (maquina.getSetor().getIdSetor() == 0) {
         throw new CampoNaoInformadoException("Selecione o Setor.");
      } else if (maquina.getPessoa().getIdPessoa() == 0) {
         throw new CampoNaoInformadoException("O campo Responsável está vazio ou incorreto.");
      } else if (maquina.getTombamento() == 0) {
         throw new CampoNaoInformadoException("O campo Tombamento está vazio.");
      }

      if (alt_modelo) {
         if (maquina.getModelo() == null || maquina.getModelo().isEmpty()) {
            throw new CampoNaoInformadoException("O campo Modelo está vazio.");
         } else if (maquina.getModelo().length() < 30) {
            throw new CampoNaoInformadoException("O campo Modelo deve ser mais específico. Digite pelo menos 30 caracteres.");
         }
      }

      boolean works = false;
      try {
         Connection.getInstance().setAutoCommit(false);

         if (MaquinaDao.getInstance().update(maquina)) {

            if (alt_modelo) {
               if (MaquinaDao.getInstance().updateHostDetails(maquina, path)) {
                  works = true;
               } else {
                  Connection.getInstance().rollback();
                  Connection.getInstance().setAutoCommit(true);
               }
            }
         } else {
            Connection.getInstance().rollback();
            Connection.getInstance().setAutoCommit(true);
         }
         Connection.getInstance().commit();
         return works;
      } catch (Exception e) {
         Connection.getInstance().rollback();
         throw new Exception(e);
      } finally {
         Connection.getInstance().setAutoCommit(true);
      }
   }
}
